import cv2
import subprocess

# 捕获摄像头
cap = cv2.VideoCapture(0)

# 视频编码器
fourcc = cv2.VideoWriter_fourcc(*'XVID')

# 视频流的宽高
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) + 0.5)
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) + 0.5)
size = (width, height)

# 盲杖mac码
mac = '1234'

# 使用ffmpeg推流
command = ['ffmpeg',
           '-y',  # 覆盖输出文件
           '-f', 'rawvideo',  # 输入格式
           '-vcodec', 'rawvideo',
           '-pix_fmt', 'bgr24',  # 输入像素格式
           '-s', '{}x{}'.format(*size),  # 输入大小
           '-r', '20',  # 帧率
           '-i', '-',  # 输入来自stdin
           '-c:v', 'libx264',  # 编码格式
           '-pix_fmt', 'yuv420p',  # 输出像素格式
           '-preset', 'ultrafast',  # 编码速度和质量的平衡
           '-f', 'flv',  # 输出格式
           'rtmp://8.148.20.110:1935/live/' + mac]  # 输出地址

pipe = subprocess.Popen(command, stdin=subprocess.PIPE)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # 写视频帧到管道
    pipe.stdin.write(frame.tobytes())

# 释放资源
cap.release()
pipe.terminate()